package com.xiaoming.backend.util;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import java.util.Optional;

/**
        * 时间处理工具类（Java 8+）
        * 功能包含：格式转换、日期计算、时区转换、新旧API互操作等
        */
public class BackendDealUtils {
    // 预定义常用格式[4,6](@ref)
    private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private static final DateTimeFormatter DATE_ONLY_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    private static final DateTimeFormatter TIME_ONLY_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");

    private static final DateTimeFormatter DATE_TIME_ONLY_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");

    //------------------------ 基础操作 ------------------------
    /** 获取当前时间戳（兼容旧系统）[8](@ref) */
    public static long currentTimestamp() {
        return System.currentTimeMillis();
    }

    /** 获取带时区的当前时间（默认系统时区）[4](@ref) */
    public static ZonedDateTime now() {
        return ZonedDateTime.now();
    }

    //------------------------ 格式转换 ------------------------
    /** 字符串转时间对象（自动识别常见格式）[6](@ref) */
    public static Optional<LocalDateTime> parse(String timeStr) {
        try {
            return Optional.of(LocalDateTime.parse(timeStr, DEFAULT_FORMATTER));
        } catch (Exception e1) {
            try {
                return Optional.of(LocalDate.parse(timeStr, DATE_ONLY_FORMATTER).atStartOfDay());
            } catch (Exception e2) {
                return Optional.empty();
            }
        }
    }

    /** 格式化输出（默认格式）[6](@ref) */
    public static String format(LocalDateTime dateTime) {
        return dateTime.format(DEFAULT_FORMATTER);
    }

    /** 格式化输出（默认格式）[6](@ref) */
    public static String formatOrderSqno(Date date) {
        return date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime().format(DATE_TIME_ONLY_FORMATTER);
    }

    /** 自定义格式输出[4](@ref) */
    public static String format(LocalDateTime dateTime, String pattern) {
        return dateTime.format(DateTimeFormatter.ofPattern(pattern));
    }

    //------------------------ 日期计算 ------------------------
    /** 增加时间单位（支持ChronoUnit枚举）[4](@ref) */
    public static LocalDateTime plus(LocalDateTime baseTime, long amount, ChronoUnit unit) {
        return baseTime.plus(amount, unit);
    }

    /** 获取本月最后一天[6](@ref) */
    public static LocalDateTime endOfMonth(LocalDateTime dateTime) {
        return dateTime.with(TemporalAdjusters.lastDayOfMonth());
    }

    /** 计算时间差[6](@ref) */
    public static long between(LocalDateTime start, LocalDateTime end, ChronoUnit unit) {
        return unit.between(start, end);
    }

    //------------------------ 时区转换 ------------------------
    /** 时区转换（格式：Asia/Shanghai）[4](@ref) */
    public static ZonedDateTime convertZone(LocalDateTime localTime, String zoneId) {
        return localTime.atZone(ZoneId.systemDefault())
                .withZoneSameInstant(ZoneId.of(zoneId));
    }

    //------------------------ 兼容处理 ------------------------
    /** Date转LocalDateTime（旧系统兼容）[8](@ref) */
    public static LocalDateTime fromDate(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
    }

    /** LocalDateTime转Date（旧系统兼容）[8](@ref) */
    public static Date toDate(LocalDateTime dateTime) {
        return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
    }
}